package models

import (
	"errors"
	"fmt"
	"gorm.io/gorm"
)

// GitProDetails 表示 Git 项目关联信息表
type GitProDetails struct {
	ID                   uint64 `gorm:"primaryKey;autoIncrement" json:"id" form:"id"`
	ProjectID            uint64 `gorm:"column:project_id;notNull" json:"project_id" form:"project_id"`
	ProjectName          string `gorm:"column:project_name;size:255;notNull" json:"project_name" form:"project_name"`
	ProjectOwnerName     string `gorm:"column:project_owner_name;size:255;notNull" json:"project_owner_name" form:"project_owner_name"`
	ProjectOwnerHTMLURL  string `gorm:"column:project_owner_html_url;size:255;notNull" json:"project_owner_html_url" form:"project_owner_html_url"`
	ProjectOwnerEmail    string `gorm:"column:project_owner_email;size:255" json:"project_owner_email" form:"project_owner_email"`
	ProjectGitURL        string `gorm:"column:project_git_url;size:255;notNull" json:"project_git_url" form:"project_git_url"`
	RepositoryGitHTTPURL string `gorm:"column:repository_git_http_url;size:255;notNull" json:"repository_git_http_url" form:"repository_git_http_url"`
	CommitsURL           string `gorm:"column:commits_url;size:255;notNull" json:"commits_url" form:"commits_url"`
	ProjectLanguage      string `gorm:"column:project_language;size:255;notNull" json:"project_language" form:"project_language"`
	Path                 string `gorm:"column:path;size:255;notNull" json:"path" form:"path"`
}

// TableName 返回表名
func (GitProDetails) TableName() string {
	return "git_pro_details"
}

//	GetGitInfoByProjectID
//
// 描述信息： 根据 project_id 查询并返回项目的 Git 信息
//
// Param：
//
//	db ：数据库连接实例
//	projectID ：项目id
//
// Return：
//
//	GitProDetails ：查询到的git详细信息
//	error ：错误信息
func GetGitInfoByProjectID(db *gorm.DB, projectID uint64) (GitProDetails, error) {
	var gitInfo GitProDetails
	result := db.Where("project_id = ?", projectID).First(&gitInfo)
	if result.Error != nil {
		return GitProDetails{}, result.Error
	}
	return gitInfo, nil
}

//	GetGitInfosByProjectIDs
//
// 描述信息： 根据项目 ID 列表查询并返回 Git 信息列表
//
// Param：
//
//	db ：数据库连接实列
//	projectIDs ：项目id列表
//
// Return：
//
//	[]GitProDetails ：项目git信息列表
//	error ：错误信息
func GetGitInfosByProjectIDs(db *gorm.DB, projectIDs []uint64) ([]GitProDetails, error) {
	var gitInfos []GitProDetails

	for _, projectID := range projectIDs {
		gitInfo, err := GetGitInfoByProjectID(db, projectID)
		if err != nil {
			return nil, err // 如果查询过程中出现错误，直接返回错误
		}
		if gitInfo.ID != 0 {
			gitInfos = append(gitInfos, gitInfo) // 如果找到对应的 Git 信息，添加到结果列表中
		}
	}

	return gitInfos, nil
}

//	InsertGitProDetails
//
// 描述信息： 插入一条数据到数据库
//
// Param：
//
//	db ：数据库链接实例
//	projectID ：项目id
//	projectName ：项目git名称
//	projectOwnerName ：项目所有者姓名
//	projectOwnerHTMLURL ：项目所有者详情url
//	projectOwnerEmail ：项目所有者邮件
//	projectGitURL ：项目http git地址
//	repositoryGitHTTPURL ：项目仓库地址
//	commitsURL ：提交前后对比
//	projectLanguage ：项目语言
//	path ：克隆时项目文件名
//
// Return：
//
//	error ：错误信息
func (g GitProDetails) InsertGitProDetails(db *gorm.DB, projectID uint64, projectName, projectOwnerName, projectOwnerHTMLURL, projectOwnerEmail, projectGitURL, repositoryGitHTTPURL, commitsURL, projectLanguage, path string) error {
	// 先根据 project_git_url 查询是否存在记录
	var existingRecord GitProDetails
	result := db.Where("project_git_url = ?", projectGitURL).First(&existingRecord)
	if result.Error != nil {
		// 检查错误是否为“未找到记录”的错误
		if !errors.Is(result.Error, gorm.ErrRecordNotFound) {
			// 如果是其他错误，返回错误
			return result.Error
		}
		// 如果是“未找到记录”的错误，忽略并继续执行
		// 如果不存在记录，插入新数据
		details := GitProDetails{
			ProjectID:            projectID,
			ProjectName:          projectName,
			ProjectOwnerName:     projectOwnerName,
			ProjectOwnerHTMLURL:  projectOwnerHTMLURL,
			ProjectOwnerEmail:    projectOwnerEmail,
			ProjectGitURL:        projectGitURL,
			RepositoryGitHTTPURL: repositoryGitHTTPURL,
			CommitsURL:           commitsURL,
			ProjectLanguage:      projectLanguage,
			Path:                 path,
		}

		// 插入数据
		result = db.Create(&details)
		if result.Error != nil {
			return result.Error
		}
		return nil
	} else {
		// 如果已经存在记录，直接返回
		return nil
	}

}

// DeleteGitProDetailsByProjectID 根据 project_id 删除所有相关的 GitProDetails 记录
func (g GitProDetails) DeleteGitProDetailsByProjectID(db *gorm.DB, projectID uint64) error {
	result := db.Where("project_id = ?", projectID).Delete(&GitProDetails{})
	if result.Error != nil {
		return fmt.Errorf("failed to delete git project details with project_id %d: %w", projectID, result.Error)
	}
	return nil
}
